<?php
error_reporting(E_ERROR | E_PARSE);
//test_tokens script script created by Robert Cox on April 12th 2011
//Commandline Usage: ./test_tokens.php commandline (debug)
//URL Usage: http://.../../test_tokens.php?web=1              <= normal mode
//      -or- http://.../../test_tokens.php?web=1&debug=1      <= debug mode

// set start time
$mtime = microtime();
$mtime = explode(' ', $mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

if(isset($_GET['debug'])){
                $debug = TRUE;
                $GLOBALS["debug"] = TRUE;
        } else {
                unset($debug);
        }

if(isset($_GET['web'])){
                $web = TRUE;
                $GLOBALS["web"] = TRUE;
        } else {
                unset($web);
        }


if (isset($debug)) { 
	echo "<br>* * * * *  D E B U G = O N * * * * *<br>";
	if (isset($web)) { 
		echo "<br>* * * * *  W E B = O N  * * * * *<br>";}
}

$status = "";
$testname = "Companion Test";
$testdesc = "Verify that companion ads are working";
$testurl = "test_companion.php";
$testtime = time();

// Setup the archival file name for the test
$datestamp = date("YmdGis",$testtime);
$tokendate = date("Y-m-d",$testtime);
$tokentime = date("G:i:s",$testtime);

$directory = "/http/matchtest/archived_results/companiontest/";

if(!is_dir($directory)){
	if(!mkdir($directory, 0777)) {
		die('Failed to create directory: '.$directory);
	}
}

$today = date("F j, Y, g:i a");
$random = rand();
$Mid = rand();
$ViewID = rand();
$ViewID1 = rand();

$UserAgent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16";

function TraceInfo($output,$string,$debug) {
        $line_match = array_values(preg_grep("/$string/", $output));
            if (isset($GLOBALS["debug"])) { echo "DEBUG - string:  ".$string."<br>";}
            if (isset($GLOBALS["debug"])) { echo "DEBUG - output:  <br><pre>"; print_r($output); echo "</pre><br>";}
            if (isset($GLOBALS["debug"])) { echo "DEBUG - line_match:<br><pre>"; print_r($line_match); echo "</pre><br>";}
			$result = $line_match[1];
        if (isset($GLOBALS["debug"])) { echo "DEBUG - result:  ".$result."<br>";}
		return $result;
}

function MakeRequest($AdCall, $debug) {
		$url = $AdCall."/trace=1/nolog";

        // initilize the curl call
        $ch = curl_init();
        // Set curl to use $url for http call
        curl_setopt($ch, CURLOPT_URL, $url);
        // show client headers
        curl_setopt($ch, CURLOPT_HEADER, 1);
        // have curl put X-Forwarded-For into headers
        curl_setopt($ch,CURLOPT_HTTPHEADER, $client_headers);
        // store results as the return of curl_exec
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        // Follow redirects
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);		
        // if HTML error 400 over over, fail
        curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
		// execute the curl command with the defined URL
        $output = curl_exec($ch);
        if (isset($debug)) { echo "<br><pre><hr>HTTP Response Output:<br><br>"; print_r($output); echo "</pre><br><hr>"; }

        $output_array = preg_split('/[\n]/', $output, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
		
        if (isset($debug)) { echo "<br><pre><hr>HTTP Response Output (array):<br><br>"; print_r($output_array); echo "</pre><br><hr>"; }

        //get curl info
        $info = curl_getinfo($ch);
        if (isset($debug)) { echo "<br><pre><hr>CURL Response Info:<br><br>"; print_r($info); echo "</pre><br><hr>"; }

        //close curl connection
        curl_close($ch);

        /** get HTTP return header (code AND text) **/

        $http_response = array_values(preg_grep("/^HTTP/", $output_array));
        $http_array = explode(" ",$http_response[0]);
        $http_return_code = trim($http_array[1]);
        $http_return_text = trim($http_array[2]);
        if (isset($debug)) { echo "<br>DEBUG - HTTP CODE/TEXT: $http_response[0]<br>"; }

        /* check code = 200 and text equal OK, anything else we have an error */

        if ($http_return_text != "OK" || $http_return_code != "200") {
            if (isset($debug)) { echo "***** ALERT - HTTP CODE/TEXT: ".trim($http_response[0])." *****<br>"; }
				echo "HTTP return code/text was not 200/OK". trim($http_response[0])."<br>";
                die;
        }
		
	return $output_array;
}

function ArrayToText($output_array){
		// count the number of elements in the response array
		$num_elements = count($output_array);
        if (isset($debug)) { echo "The Number Of Elements in the OUTPUT Array are: ".$num_elements." <br>"; }
		
		// format the items in the array as a long concatenated string.
		$y=0;
		while($y <= $num_elements){
			$formatted_output = $formatted_output.$output_array[$y]."\n";
			$formatted_output_web = $formatted_output_web.$output_array[$y]."<br>";
			$y++;
		}
        if (isset($debug)) { echo "The Formatted contents of OUTPUT are: ".$formatted_output_web." *****<br>"; }
		
	return $formatted_output;
}

function GetFCID($TraceTargeting) {
	$explode = explode(" ", $TraceTargeting);
	return $explode[7];
}

// setup command line args (commandline only)

if (isset($argv[1])) { $commandline = $argv[1]; unset($debug);} 

        $AdCallURL = "http://crtldev.aimatch.com:60000";
		$Directive = "/canary/hserver/";
        $PathInfo = "mid=".$Mid."/viewid=".$ViewID."/area=companion/random=".$random;
		$size468x60 = "/size=468x60";
		$size125x125 = "/size=125x125";
		$size160x600 = "/size=160x600";		
		$url468x60 = $AdCallURL.$Directive.$PathInfo.$size468x60;
		$url125x125 = $AdCallURL.$Directive.$PathInfo.$size125x125;
		$url160x600 = $AdCallURL.$Directive.$PathInfo.$size160x600;
        $client_headers[] = sprintf('X-Forwarded-For: %s', $ClientIP);

		// Make the adcall for SIZE=468x60
		$output468x60 = MakeRequest($AdCallURL.$Directive.$PathInfo.$size468x60,$debug);
        $TraceTargeting468x60 = TraceInfo($output468x60,">>>>");
		$FCID468x60 = GetFCID($TraceTargeting468x60);
        if (isset($debug)) { echo "TraceTargeting = ".$TraceTargeting468x60."<br>FCID = ".$FCID468x60."<br>"; }
		$FormattedOutput468x60 = ArrayToText($output468x60);
        if (isset($debug)) { echo "<pre>The Formatted contents of OUTPUT468x60 are: <br>".$FormattedOutput468x60."</pre><br>"; }
		
		// Make the adcall for SIZE=125x125
		$output125x125 = MakeRequest($AdCallURL.$Directive.$PathInfo.$size125x125,$debug);
        $TraceTargeting125x125 = TraceInfo($output125x125,">>>>");
		$FCID125x125 = GetFCID($TraceTargeting125x125);
        if (isset($debug)) { echo "TraceTargeting = ".$TraceTargeting125x125."<br>FCID = ".$FCID125x125."<br>"; }
		$FormattedOutput125x125 = ArrayToText($output125x125);
        if (isset($debug)) { echo "<pre>The Formatted contents of OUTPUT125x125 are: <br>".$FormattedOutput125x125."</pre><br>"; }

		// Make the adcall for SIZE=160x600
		$output160x600 = MakeRequest($AdCallURL.$Directive.$PathInfo.$size160x600,$debug);
        $TraceTargeting160x600 = TraceInfo($output160x600,">>>>");
		$FCID160x600 = GetFCID($TraceTargeting160x600);
        if (isset($debug)) { echo "TraceTargeting = ".$TraceTargeting160x600."<br>FCID = ".$FCID160x600."<br>"; }
		$FormattedOutput160x600 = ArrayToText($output160x600);
        if (isset($debug)) { echo "<pre>The Formatted contents of OUTPUT160x600 are: <br>".$FormattedOutput160x600."</pre><br>"; }
// STRICT ads = 9, 10, 11
// STRICT ads = 8, 7, 6
// LOOSE ads = 12, 14, 13
// LOOSE ads = 19, 20, 18
// LOOSE ads = 15, 16, 17
// House Ads = 24, 25, 26		
		
//		$FCID468x60 = 12;
//		$FCID125x125 = 14;
//		$FCID160x600 = 11;

		// House Ads
		if ($FCID468x60 == 24) { $AdWeight1 = 0; }
		if ($FCID125x125 == 25) { $AdWeight2 = 0; }
		if ($FCID160x600 == 26) { $AdWeight3 = 0; }
		// Loose Ads
		if ($FCID468x60 == 12) { $AdWeight1 = 10; }
		if ($FCID125x125 == 14) { $AdWeight2 = 10; }
		if ($FCID160x600 == 13) { $AdWeight3 = 10; }
		if ($FCID468x60 == 19) { $AdWeight1 = 10; }
		if ($FCID125x125 == 20) { $AdWeight2 = 10; }
		if ($FCID160x600 == 18) { $AdWeight3 = 10; }
		if ($FCID468x60 == 15) { $AdWeight1 = 10; }
		if ($FCID125x125 == 16) { $AdWeight2 = 10; }
		if ($FCID160x600 == 17) { $AdWeight3 = 10; }
		// Strict Ads
		if ($FCID468x60 == 9) { $AdWeight1 = 100; }
		if ($FCID125x125 == 10) { $AdWeight2 = 100; }
		if ($FCID160x600 == 11) { $AdWeight3 = 100; }
		if ($FCID468x60 == 8) { $AdWeight1 = 1000; }
		if ($FCID125x125 == 7) { $AdWeight2 = 1000; }
		if ($FCID160x600 == 6) { $AdWeight3 = 1000; }
		
		$AdsServed = $AdWeight1+$AdWeight2+$AdWeight3;
		
// Determine if the test was successful
		if($AdsServed == 300){  // STRICT ads served in all spots - test passed.
				$status = "pass";
				$companion = "strict_companion";
				$reason = "STRICT companion Ads were served in all three sizes";
			}
		else if($AdsServed == 3000){  // STRICT ads served in all spots - test passed.
				$status = "pass";
				$companion = "strict_companion";
				$reason = "STRICT companion Ads were served in all three sizes";
			}
		else if(($AdsServed > 30) && ($AdsServed != 300) && ($AdsServed !=3000)){  // STRICT ads along with LOOSE ads - test failed.
				$status = "fail";
				$companion = "companion";
				$reason = "LOOSE and STRICT or STRICT ads from different flights were served in the same page id";
			}
		else if($AdsServed == 30){  // LOOSE ads served in all spots - test passed.
				$status = "pass";
				$companion = "loose_companion";
				$reason = "LOOSE ads were served to all three sizes";
			}
		else if($AdsServed < 30){  // LOOSE ads and HOUSE ads served in all spots - test passed.
				$status = "pass";
				$companion = "loose_companion";
				$reason = "LOOSE ads served along with HOUSE ads for the same page id";
			}
		else if($AdsServed == 0){  // HOUSE ads served in all spots - test passed.
				$status = "pass";
				$companion = "no_companion";
				$reason = "LOOSE ads served along with HOUSE ads for the same page id";
			}
		else{     // Non-strict ads served in this spot so the test passed.
				$status = "pass";
				$reason = "xxxx";
				$companion = "no_companion";
			}


// Determine if the test was successful

	if (isset($debug)) { echo "Test Summary:<br>"; }
	if (isset($debug)) { echo "Status: ".$status."<br>"; }
	if (isset($debug) && $status == "fail") { echo "Reason for Failure: ".$reason."<br>"; }

	
	$ArchiveOutputFile = "Test Summary: \n    Status: ".$status."\n";
    $ArchiveOutputFile = $ArchiveOutputFile."    Reason: ".$reason."\n\n"; 
	$ArchiveOutputFile = $ArchiveOutputFile."Banner = ".$TraceTargeting468x60."\nFCID = ".$FCID468x60."\n\n";
	$ArchiveOutputFile = $ArchiveOutputFile."Rectangle = ".$TraceTargeting125x125."\nFCID = ".$FCID125x125."\n\n";
	$ArchiveOutputFile = $ArchiveOutputFile."Promo = ".$TraceTargeting160x600."\nFCID = ".$FCID160x600."\n\n-----------------------------------";
	$ArchiveOutputFile = $ArchiveOutputFile."\nDetailed Results Banner:\n\n".$FormattedOutput468x60."\n\n-----------------------------------";
	$ArchiveOutputFile = $ArchiveOutputFile."\nDetailed Results Rectangle:\n\n".$FormattedOutput125x125."\n\n-----------------------------------";
	$ArchiveOutputFile = $ArchiveOutputFile."\nDetailed Results Promo:\n\n".$FormattedOutput160x600."\n\n-----------------------------------";

	if ($status == "pass") { $ArchiveOutputWeb = "<font size=\"3\"><b>Test Summary:</b></font><br>&nbsp;&nbsp;&nbsp;&nbsp;<font size=\"3\" color=\"green\"><b>Status: ".$status."</b></font><br>"; }
	if ($status == "fail") { $ArchiveOutputWeb = "<font size=\"3\"><b>Test Summary:<b></font><br>&nbsp;&nbsp;&nbsp;&nbsp;<font size=\"3\" color=\"red\"><b>Status: ".$status."</b></font><br>"; }
    $ArchiveOutputWeb = $ArchiveOutputWeb."&nbsp;&nbsp;&nbsp;&nbsp;Reason: ".$reason."<br><br>"; 
	$ArchiveOutputWeb = $ArchiveOutputWeb."<br>Banner = ".$TraceTargeting468x60."<br>FCID = ".$FCID468x60."<br>";
	$ArchiveOutputWeb = $ArchiveOutputWeb."<br>Rectangle = ".$TraceTargeting125x125."<br>FCID = ".$FCID125x125."<br>";
	$ArchiveOutputWeb = $ArchiveOutputWeb."<br>Promo = ".$TraceTargeting160x600."<br>FCID = ".$FCID160x600."<br>";
	$ArchiveOutputWeb = $ArchiveOutputWeb."<br><hr>Detailed Results Banner:<pre>".$FormattedOutput468x60."</pre><hr>";
	$ArchiveOutputWeb = $ArchiveOutputWeb."Detailed Results Rectangle:<pre>".$FormattedOutput125x125."</pre><hr>";
	$ArchiveOutputWeb = $ArchiveOutputWeb."Detailed Results Promo:<pre>".$FormattedOutput160x600."</pre>";

	if (isset($web)) { echo $ArchiveOutputWeb; }
	
// Write out the information to the testresults.txt file.

$lines = file('/http/matchtest/testresults.txt');
$numitems = count($lines);

// Loop through our array, show HTML source as HTML source; and line numbers too.

if (isset($debug)) { echo "<br><pre><hr>HTTP Response Output:<br><br>"; print_r($lines); echo "</pre><br><hr>"; }

$newfile = $lines[0];
$i=1;
while($i <= $numitems) {
	$pieces = explode("|",$lines[$i]);
// Search through the file for the proper testname
	if($testname == $pieces[1] && isset($commandline)){
	// once the proper line is found replace the line with the updated test results.
		// if the prior test results are PASS and the new test results are FAIL write out the new results.
		if($pieces[0] == "pass" && $status == "fail") {
			$replaced_line = $status."|".$testname."|".$testdesc."|".$testurl."|".$testtime;
		}
		// if the prior test results are FAIL and then new test results are FAIL update the test time.
		else if ($pieces[0] == "fail" && $status == "fail") {
			$replaced_line = "fail|".$testname."|".$testdesc."|".$testurl."|".$testtime;
		}
		// if the prior test results are FAIL and the new test results are PASS then do not change the status.
		else if ($pieces[0] == "fail" && $status == "pass") {
			$replaced_line = "fail|".$testname."|".$testdesc."|".$testurl."|".$testtime;
		}
		else if ($pieces[0] == "pass" && $status == "pass") {
			$replaced_line = $status."|".$testname."|".$testdesc."|".$testurl."|".$testtime;
		}
		$newfile = $newfile.$replaced_line;
	}
	else if ($testname == $pieces[1] && isset($web)){
		$replaced_line = $status."|".$testname."|".$testdesc."|".$testurl."|".$testtime;
		$newfile = $newfile.$replaced_line;
	
	}
	else{
		$newfile = $newfile.$lines[$i];
	}
	$i++;
}

if (isset($debug)) { echo "<br><pre><hr>New File Output:<br><br>"; print_r($newfile); echo "</pre><br><hr>"; }

$fp = fopen('/http/matchtest/testresults.txt', 'w');

fwrite($fp, $newfile);
fclose($fp);

// Write out results of the test to a file 
if (isset($web)) { $testfilename = $directory.$companion.".web.".$status.".".$datestamp.".".$testtime.".txt"; }
if (isset($commandline)) { $testfilename = $directory.$companion.".commandline.".$status.".".$datestamp.".".$testtime.".txt"; }

	if (!$fp1 = fopen($testfilename,'w')) {
		echo "Cannot open file ($testfilename)";
		exit;
	}

	fwrite ($fp1,$ArchiveOutputFile."\n\n");
	fclose($fp1);

if (isset($debug)) { phpinfo(); }
?>
